JavaScript async iterator helpers માં એરર હેન્ડલિંગ માટે એક વ્યાપક માર્ગદર્શિકા. એરર પ્રોપેગેશન, ઉદાહરણો, અને મજબૂત સ્ટ્રીમિંગ એપ્લિકેશન્સ માટે શ્રેષ્ઠ પદ્ધતિઓ.
JavaScript Async Iterator Helper એરર પ્રોપેગેશન: મજબૂત એપ્લિકેશન્સ માટે સ્ટ્રીમ એરર હેન્ડલિંગ
આધુનિક JavaScript ડેવલપમેન્ટમાં અસિંક્રોનસ પ્રોગ્રામિંગ સર્વવ્યાપક બની ગયું છે, ખાસ કરીને જ્યારે ડેટાના સ્ટ્રીમ્સ સાથે કામ કરવામાં આવે છે. Async iterators અને async generator functions ડેટાને અસિંક્રોનસ રીતે, એક પછી એક એલિમેન્ટ પર પ્રક્રિયા કરવા માટે શક્તિશાળી સાધનો પૂરા પાડે છે. જોકે, મજબૂત અને વિશ્વસનીય એપ્લિકેશન્સ બનાવવા માટે આ રચનાઓમાં ભૂલોને યોગ્ય રીતે હેન્ડલ કરવી મહત્વપૂર્ણ છે. આ વ્યાપક માર્ગદર્શિકા JavaScript ના async iterator helpers માં એરર પ્રોપેગેશનની જટિલતાઓને શોધે છે, જેમાં સ્ટ્રીમિંગ એપ્લિકેશન્સમાં ભૂલોને અસરકારક રીતે સંચાલિત કરવા માટે વ્યવહારુ ઉદાહરણો અને શ્રેષ્ઠ પદ્ધતિઓ પ્રદાન કરવામાં આવી છે.
Async Iterators અને Async Generator Functions ને સમજવું
એરર હેન્ડલિંગમાં ઊંડા ઉતરતા પહેલા, ચાલો async iterators અને async generator functions ના મૂળભૂત સિદ્ધાંતોની સંક્ષિપ્ત સમીક્ષા કરીએ.
Async Iterators
એક async iterator એ એક ઓબ્જેક્ટ છે જે next() મેથડ પૂરી પાડે છે, જે એક પ્રોમિસ રિટર્ન કરે છે જે value અને done પ્રોપર્ટીઝવાળા ઓબ્જેક્ટમાં રિઝોલ્વ થાય છે. value પ્રોપર્ટી સિક્વન્સમાં આગલું મૂલ્ય ધરાવે છે, અને done પ્રોપર્ટી સૂચવે છે કે ઇટરેટર પૂર્ણ થયું છે કે નહીં.
ઉદાહરણ:
async function* createAsyncIterator(data) {
for (const item of data) {
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate asynchronous operation
yield item;
}
}
const asyncIterator = createAsyncIterator([1, 2, 3]);
async function consumeIterator() {
let result = await asyncIterator.next();
while (!result.done) {
console.log(result.value);
result = await asyncIterator.next();
}
}
consumeIterator(); // Output: 1, 2, 3 (with delays)
Async Generator Functions
એક async generator function એ એક ખાસ પ્રકારનું ફંક્શન છે જે એક async iterator રિટર્ન કરે છે. તે yield કીવર્ડનો ઉપયોગ કરીને અસિંક્રોનસ રીતે મૂલ્યો ઉત્પન્ન કરે છે.
ઉદાહરણ:
async function* generateSequence(start, end) {
for (let i = start; i <= end; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate asynchronous operation
yield i;
}
}
async function consumeGenerator() {
for await (const num of generateSequence(1, 5)) {
console.log(num);
}
}
consumeGenerator(); // Output: 1, 2, 3, 4, 5 (with delays)
Async Streams માં એરર હેન્ડલિંગનો પડકાર
સિંક્રોનસ કોડની તુલનામાં અસિંક્રોનસ સ્ટ્રીમ્સમાં એરર હેન્ડલિંગ અનન્ય પડકારો રજૂ કરે છે. પરંપરાગત try/catch બ્લોક્સ ફક્ત તાત્કાલિક સિંક્રોનસ સ્કોપમાં થતી ભૂલોને જ પકડી શકે છે. async iterator અથવા generator ની અંદર અસિંક્રોનસ ઓપરેશન્સ સાથે કામ કરતી વખતે, ભૂલો જુદા જુદા સમયે થઈ શકે છે, જેના માટે એરર પ્રોપેગેશન માટે વધુ સુસંસ્કૃત અભિગમની જરૂર પડે છે.
એક એવા દૃશ્યનો વિચાર કરો જ્યાં તમે રિમોટ API માંથી ડેટા પ્રોસેસ કરી રહ્યા છો. API કોઈપણ સમયે એરર રિટર્ન કરી શકે છે, જેમ કે નેટવર્ક નિષ્ફળતા અથવા સર્વર-સાઇડ સમસ્યા. તમારી એપ્લિકેશનને આ ભૂલોને યોગ્ય રીતે હેન્ડલ કરવા, તેમને લોગ કરવા, અને સંભવિતપણે ઓપરેશનને ફરીથી પ્રયાસ કરવા અથવા ફોલબેક મૂલ્ય પ્રદાન કરવા માટે સક્ષમ હોવી જોઈએ.
Async Iterator Helpers માં એરર પ્રોપેગેશન માટેની વ્યૂહરચનાઓ
async iterator helpers માં ભૂલોને અસરકારક રીતે હેન્ડલ કરવા માટે ઘણી વ્યૂહરચનાઓનો ઉપયોગ કરી શકાય છે. ચાલો કેટલીક સૌથી સામાન્ય અને અસરકારક તકનીકોનું અન્વેષણ કરીએ.
1. Async Generator Function ની અંદર Try/Catch બ્લોક્સ
સૌથી સીધા અભિગમોમાંથી એક એ છે કે async generator function ની અંદર અસિંક્રોનસ ઓપરેશન્સને try/catch બ્લોક્સમાં લપેટવું. આ તમને જનરેટરના એક્ઝેક્યુશન દરમિયાન થતી ભૂલોને પકડવા અને તે મુજબ હેન્ડલ કરવાની મંજૂરી આપે છે.
ઉદાહરણ:
async function* fetchData(urls) {
for (const url of urls) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
yield data;
} catch (error) {
console.error(`Error fetching data from ${url}:`, error);
// Optionally, yield a fallback value or re-throw the error
yield { error: error.message, url: url }; // Yield an error object
}
}
}
async function consumeData() {
for await (const item of fetchData(['https://example.com/data1', 'https://example.com/data2'])) {
if (item.error) {
console.warn(`Encountered an error for URL: ${item.url}, Error: ${item.error}`);
} else {
console.log('Received data:', item);
}
}
}
consumeData();
આ ઉદાહરણમાં, fetchData જનરેટર ફંક્શન URLs ની યાદીમાંથી ડેટા મેળવે છે. જો fetch ઓપરેશન દરમિયાન કોઈ એરર આવે છે, તો catch બ્લોક એરરને લોગ કરે છે અને એરર ઓબ્જેક્ટને yield કરે છે. ત્યારબાદ કન્ઝ્યુમર ફંક્શન yield થયેલા મૂલ્યમાં error પ્રોપર્ટી માટે તપાસ કરે છે અને તે મુજબ તેને હેન્ડલ કરે છે. આ પેટર્ન ખાતરી કરે છે કે ભૂલો સ્થાનિક છે અને જનરેટરની અંદર હેન્ડલ થાય છે, જે સમગ્ર સ્ટ્રીમને ક્રેશ થવાથી અટકાવે છે.
2. એરર હેન્ડલિંગ માટે `Promise.prototype.catch` નો ઉપયોગ કરવો
બીજી સામાન્ય તકનીકમાં async generator function ની અંદર પ્રોમિસ પર .catch() મેથડનો ઉપયોગ શામેલ છે. આ તમને પ્રોમિસના રિઝોલ્યુશન દરમિયાન થતી ભૂલોને હેન્ડલ કરવાની મંજૂરી આપે છે.
ઉદાહરણ:
async function* fetchData(urls) {
for (const url of urls) {
const promise = fetch(url)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.catch(error => {
console.error(`Error fetching data from ${url}:`, error);
return { error: error.message, url: url }; // Return an error object
});
yield await promise;
}
}
async function consumeData() {
for await (const item of fetchData(['https://example.com/data1', 'https://example.com/data2'])) {
if (item.error) {
console.warn(`Encountered an error for URL: ${item.url}, Error: ${item.error}`);
} else {
console.log('Received data:', item);
}
}
}
consumeData();
આ ઉદાહરણમાં, .catch() મેથડનો ઉપયોગ fetch ઓપરેશન દરમિયાન થતી ભૂલોને હેન્ડલ કરવા માટે થાય છે. જો કોઈ એરર આવે છે, તો catch બ્લોક એરરને લોગ કરે છે અને એરર ઓબ્જેક્ટ રિટર્ન કરે છે. જનરેટર ફંક્શન પછી પ્રોમિસનું પરિણામ yield કરે છે, જે કાં તો મેળવેલો ડેટા અથવા એરર ઓબ્જેક્ટ હશે. આ અભિગમ પ્રોમિસ રિઝોલ્યુશન દરમિયાન થતી ભૂલોને હેન્ડલ કરવાની એક સ્વચ્છ અને સંક્ષિપ્ત રીત પ્રદાન કરે છે.
3. કસ્ટમ એરર હેન્ડલિંગ હેલ્પર ફંક્શન લાગુ કરવું
વધુ જટિલ એરર હેન્ડલિંગ દૃશ્યો માટે, કસ્ટમ એરર હેન્ડલિંગ હેલ્પર ફંક્શન બનાવવું ફાયદાકારક બની શકે છે. આ ફંક્શન એરર હેન્ડલિંગ લોજિકને સમાવી શકે છે અને તમારી એપ્લિકેશનમાં ભૂલોને હેન્ડલ કરવાની એક સુસંગત રીત પ્રદાન કરી શકે છે.
ઉદાહરણ:
async function safeFetch(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error(`Error fetching data from ${url}:`, error);
return { error: error.message, url: url }; // Return an error object
}
}
async function* fetchData(urls) {
for (const url of urls) {
yield await safeFetch(url);
}
}
async function consumeData() {
for await (const item of fetchData(['https://example.com/data1', 'https://example.com/data2'])) {
if (item.error) {
console.warn(`Encountered an error for URL: ${item.url}, Error: ${item.error}`);
} else {
console.log('Received data:', item);
}
}
}
consumeData();
આ ઉદાહરણમાં, safeFetch ફંક્શન fetch ઓપરેશન માટે એરર હેન્ડલિંગ લોજિકને સમાવે છે. fetchData જનરેટર ફંક્શન પછી દરેક URL માંથી ડેટા મેળવવા માટે safeFetch ફંક્શનનો ઉપયોગ કરે છે. આ અભિગમ કોડની પુનઃઉપયોગિતા અને જાળવણીક્ષમતાને પ્રોત્સાહન આપે છે.
4. Async Iterator Helpers નો ઉપયોગ: `map`, `filter`, `reduce` અને એરર હેન્ડલિંગ
JavaScript ના async iterator helpers (`map`, `filter`, `reduce`, વગેરે) async સ્ટ્રીમ્સને રૂપાંતરિત કરવા અને પ્રક્રિયા કરવા માટે અનુકૂળ રીતો પ્રદાન કરે છે. આ હેલ્પર્સનો ઉપયોગ કરતી વખતે, ભૂલો કેવી રીતે પ્રસારિત થાય છે અને તેમને અસરકારક રીતે કેવી રીતે હેન્ડલ કરવી તે સમજવું મહત્વપૂર્ણ છે.
a) `map` માં એરર હેન્ડલિંગ
map હેલ્પર async સ્ટ્રીમના દરેક એલિમેન્ટ પર ટ્રાન્સફોર્મેશન ફંક્શન લાગુ કરે છે. જો ટ્રાન્સફોર્મેશન ફંક્શન એરર ફેંકે છે, તો એરર કન્ઝ્યુમર સુધી પ્રસારિત થાય છે.
ઉદાહરણ:
async function* generateNumbers(n) {
for (let i = 1; i <= n; i++) {
yield i;
}
}
async function consumeData() {
try {
const asyncIterable = generateNumbers(5);
const mappedIterable = asyncIterable.map(async (num) => {
if (num === 3) {
throw new Error('Error processing number 3');
}
return num * 2;
});
for await (const item of mappedIterable) {
console.log(item);
}
} catch (error) {
console.error('An error occurred:', error);
}
}
consumeData(); // Output: 2, 4, An error occurred: Error: Error processing number 3
આ ઉદાહરણમાં, ટ્રાન્સફોર્મેશન ફંક્શન નંબર 3 ની પ્રક્રિયા કરતી વખતે એરર ફેંકે છે. એરર consumeData ફંક્શનના catch બ્લોક દ્વારા પકડાય છે. નોંધ લો કે એરર ઇટરેશનને રોકી દે છે.
b) `filter` માં એરર હેન્ડલિંગ
filter હેલ્પર એક પ્રિડિકેટ ફંક્શનના આધારે async સ્ટ્રીમના એલિમેન્ટ્સને ફિલ્ટર કરે છે. જો પ્રિડિકેટ ફંક્શન એરર ફેંકે છે, તો એરર કન્ઝ્યુમર સુધી પ્રસારિત થાય છે.
ઉદાહરણ:
async function* generateNumbers(n) {
for (let i = 1; i <= n; i++) {
yield i;
}
}
async function consumeData() {
try {
const asyncIterable = generateNumbers(5);
const filteredIterable = asyncIterable.filter(async (num) => {
if (num === 3) {
throw new Error('Error filtering number 3');
}
return num % 2 === 0;
});
for await (const item of filteredIterable) {
console.log(item);
}
} catch (error) {
console.error('An error occurred:', error);
}
}
consumeData(); // Output: An error occurred: Error: Error filtering number 3
આ ઉદાહરણમાં, પ્રિડિકેટ ફંક્શન નંબર 3 ની પ્રક્રિયા કરતી વખતે એરર ફેંકે છે. એરર consumeData ફંક્શનના catch બ્લોક દ્વારા પકડાય છે.
c) `reduce` માં એરર હેન્ડલિંગ
reduce હેલ્પર એક રિડ્યુસર ફંક્શનનો ઉપયોગ કરીને async સ્ટ્રીમને એક જ મૂલ્યમાં ઘટાડે છે. જો રિડ્યુસર ફંક્શન એરર ફેંકે છે, તો એરર કન્ઝ્યુમર સુધી પ્રસારિત થાય છે.
ઉદાહરણ:
async function* generateNumbers(n) {
for (let i = 1; i <= n; i++) {
yield i;
}
}
async function consumeData() {
try {
const asyncIterable = generateNumbers(5);
const sum = await asyncIterable.reduce(async (acc, num) => {
if (num === 3) {
throw new Error('Error reducing number 3');
}
return acc + num;
}, 0);
console.log('Sum:', sum);
} catch (error) {
console.error('An error occurred:', error);
}
}
consumeData(); // Output: An error occurred: Error: Error reducing number 3
આ ઉદાહરણમાં, રિડ્યુસર ફંક્શન નંબર 3 ની પ્રક્રિયા કરતી વખતે એરર ફેંકે છે. એરર consumeData ફંક્શનના catch બ્લોક દ્વારા પકડાય છે.
5. `process.on('unhandledRejection')` (Node.js) અથવા `window.addEventListener('unhandledrejection')` (બ્રાઉઝર્સ) સાથે ગ્લોબલ એરર હેન્ડલિંગ
જોકે async iterators માટે વિશિષ્ટ નથી, ગ્લોબલ એરર હેન્ડલિંગ મિકેનિઝમ્સને ગોઠવવાથી તમારા સ્ટ્રીમ્સમાં થઈ શકે તેવા અનહેન્ડલ્ડ પ્રોમિસ રિજેક્શન્સ માટે સેફ્ટી નેટ પ્રદાન કરી શકાય છે. આ Node.js પર્યાવરણોમાં ખાસ કરીને મહત્વપૂર્ણ છે.
Node.js ઉદાહરણ:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// Optionally, perform cleanup or exit the process
});
async function* generateNumbers(n) {
for (let i = 1; i <= n; i++) {
if (i === 3) {
throw new Error('Simulated Error'); // This will cause an unhandled rejection if not caught locally
}
yield i;
}
}
async function main() {
const iterator = generateNumbers(5);
for await (const num of iterator) {
console.log(num);
}
}
main(); // Will trigger 'unhandledRejection' if the error inside generator isn't handled.
બ્રાઉઝર ઉદાહરણ:
window.addEventListener('unhandledrejection', (event) => {
console.error('Unhandled rejection:', event.reason, event.promise);
// You can log the error or display a user-friendly message here.
});
async function fetchData(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`); // Might cause unhandled rejection if `fetchData` isn't wrapped in try/catch
}
return response.json();
}
async function processData() {
const data = await fetchData('https://example.com/api/nonexistent'); // URL likely to cause an error.
console.log(data);
}
processData();
મહત્વપૂર્ણ વિચારણાઓ:
- ડિબગિંગ: ગ્લોબલ હેન્ડલર્સ અનહેન્ડલ્ડ રિજેક્શન્સને લોગ કરવા અને ડિબગ કરવા માટે મૂલ્યવાન છે.
- ક્લીનઅપ: એપ્લિકેશન ક્રેશ થાય તે પહેલાં ક્લીનઅપ ઓપરેશન્સ કરવા માટે તમે આ હેન્ડલર્સનો ઉપયોગ કરી શકો છો.
- ક્રેશ અટકાવવું: જોકે તેઓ ભૂલોને લોગ કરે છે, પણ જો ભૂલ મૂળભૂત રીતે લોજિકને તોડી નાખે તો તેઓ એપ્લિકેશનને સંભવિતપણે ક્રેશ થવાથી અટકાવતા *નથી*. તેથી, async સ્ટ્રીમ્સની અંદર સ્થાનિક એરર હેન્ડલિંગ હંમેશા પ્રાથમિક સંરક્ષણ છે.
Async Iterator Helpers માં એરર હેન્ડલિંગ માટેની શ્રેષ્ઠ પદ્ધતિઓ
તમારા async iterator helpers માં મજબૂત એરર હેન્ડલિંગ સુનિશ્ચિત કરવા માટે, નીચેની શ્રેષ્ઠ પદ્ધતિઓનો વિચાર કરો:
- સ્થાનિક એરર હેન્ડલિંગ: ભૂલોને તેમના સ્ત્રોતની શક્ય તેટલી નજીક હેન્ડલ કરો. અસિંક્રોનસ ઓપરેશન્સ દરમિયાન થતી ભૂલોને પકડવા માટે async generator function ની અંદર
try/catchબ્લોક્સ અથવા.catch()મેથડનો ઉપયોગ કરો. - ફોલબેક મૂલ્યો પ્રદાન કરો: જ્યારે કોઈ એરર આવે, ત્યારે સમગ્ર સ્ટ્રીમને ક્રેશ થવાથી બચાવવા માટે ફોલબેક મૂલ્ય અથવા ડિફોલ્ટ મૂલ્ય yield કરવાનું વિચારો. આ કન્ઝ્યુમરને સ્ટ્રીમ પ્રોસેસ કરવાનું ચાલુ રાખવાની મંજૂરી આપે છે, ભલે કેટલાક એલિમેન્ટ્સ અમાન્ય હોય.
- ભૂલો લોગ કરો: ડિબગિંગને સરળ બનાવવા માટે પૂરતી વિગતો સાથે ભૂલો લોગ કરો. URL, એરર મેસેજ અને સ્ટેક ટ્રેસ જેવી માહિતી શામેલ કરો.
- ઓપરેશન્સ ફરીથી પ્રયાસ કરો: નેટવર્ક નિષ્ફળતા જેવી ક્ષણિક ભૂલો માટે, ટૂંકા વિલંબ પછી ઓપરેશનને ફરીથી પ્રયાસ કરવાનું વિચારો. અનંત લૂપ્સને ટાળવા માટે મહત્તમ પ્રયાસોની સંખ્યા સાથે રિટ્રાય મિકેનિઝમ લાગુ કરો.
- કસ્ટમ એરર હેન્ડલિંગ હેલ્પર ફંક્શનનો ઉપયોગ કરો: કોડની પુનઃઉપયોગિતા અને જાળવણીક્ષમતાને પ્રોત્સાહન આપવા માટે કસ્ટમ હેલ્પર ફંક્શનમાં એરર હેન્ડલિંગ લોજિકને સમાવો.
- ગ્લોબલ એરર હેન્ડલિંગનો વિચાર કરો: Node.js માં
process.on('unhandledRejection')જેવા ગ્લોબલ એરર હેન્ડલિંગ મિકેનિઝમ્સ લાગુ કરો, જેથી અનહેન્ડલ્ડ પ્રોમિસ રિજેક્શન્સને પકડી શકાય. જોકે, પ્રાથમિક સંરક્ષણ તરીકે સ્થાનિક એરર હેન્ડલિંગ પર આધાર રાખો. - ગ્રેસફુલ શટડાઉન: સર્વર-સાઇડ એપ્લિકેશન્સમાં, ખાતરી કરો કે તમારો async સ્ટ્રીમ પ્રોસેસિંગ કોડ ડેટા નુકશાનને રોકવા અને સ્વચ્છ શટડાઉન સુનિશ્ચિત કરવા માટે
SIGINT(Ctrl+C) અનેSIGTERMજેવા સિગ્નલોને યોગ્ય રીતે હેન્ડલ કરે છે. આમાં સંસાધનો (ડેટાબેઝ કનેક્શન્સ, ફાઇલ હેન્ડલ્સ, નેટવર્ક કનેક્શન્સ) બંધ કરવા અને કોઈપણ બાકી ઓપરેશન્સ પૂર્ણ કરવાનો સમાવેશ થાય છે. - મોનિટર અને એલર્ટ: તમારા async સ્ટ્રીમ પ્રોસેસિંગ કોડમાં ભૂલોને શોધવા અને પ્રતિસાદ આપવા માટે મોનિટરિંગ અને એલર્ટિંગ સિસ્ટમ્સ લાગુ કરો. આ તમને તમારા વપરાશકર્તાઓને અસર કરે તે પહેલાં સમસ્યાઓને ઓળખવા અને સુધારવામાં મદદ કરશે.
વ્યવહારુ ઉદાહરણો: વાસ્તવિક-દુનિયાના દૃશ્યોમાં એરર હેન્ડલિંગ
ચાલો async iterator helpers ને સંડોવતા વાસ્તવિક-દુનિયાના દૃશ્યોમાં એરર હેન્ડલિંગના કેટલાક વ્યવહારુ ઉદાહરણોની તપાસ કરીએ.
ઉદાહરણ 1: ફોલબેક મિકેનિઝમ સાથે બહુવિધ APIs માંથી ડેટા પ્રોસેસ કરવો
કલ્પના કરો કે તમારે બહુવિધ APIs માંથી ડેટા મેળવવાની જરૂર છે. જો એક API નિષ્ફળ જાય, તો તમે ફોલબેક API નો ઉપયોગ કરવા અથવા ડિફોલ્ટ મૂલ્ય રિટર્ન કરવા માંગો છો.
async function safeFetch(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error(`Error fetching data from ${url}:`, error);
return null; // Indicate failure
}
}
async function* fetchDataWithFallback(apiUrls, fallbackUrl) {
for (const apiUrl of apiUrls) {
let data = await safeFetch(apiUrl);
if (data === null) {
console.log(`Attempting fallback for ${apiUrl}`);
data = await safeFetch(fallbackUrl);
if (data === null) {
console.warn(`Fallback also failed for ${apiUrl}. Returning default value.`);
yield { error: `Failed to fetch data from ${apiUrl} and fallback.` };
continue; // Skip to the next URL
}
}
yield data;
}
}
async function processData() {
const apiUrls = ['https://api.example.com/data1', 'https://api.nonexistent.com/data2', 'https://api.example.com/data3'];
const fallbackUrl = 'https://backup.example.com/default_data';
for await (const item of fetchDataWithFallback(apiUrls, fallbackUrl)) {
if (item.error) {
console.warn(`Error processing data: ${item.error}`);
} else {
console.log('Processed data:', item);
}
}
}
processData();
આ ઉદાહરણમાં, fetchDataWithFallback જનરેટર ફંક્શન APIs ની યાદીમાંથી ડેટા મેળવવાનો પ્રયાસ કરે છે. જો કોઈ API નિષ્ફળ જાય, તો તે ફોલબેક API માંથી ડેટા મેળવવાનો પ્રયાસ કરે છે. જો ફોલબેક API પણ નિષ્ફળ જાય, તો તે એક ચેતવણી લોગ કરે છે અને એરર ઓબ્જેક્ટ yield કરે છે. કન્ઝ્યુમર ફંક્શન પછી તે મુજબ એરરને હેન્ડલ કરે છે.
ઉદાહરણ 2: એરર હેન્ડલિંગ સાથે રેટ લિમિટિંગ
APIs સાથે ક્રિયાપ્રતિક્રિયા કરતી વખતે, ખાસ કરીને થર્ડ-પાર્ટી APIs, તમારે ઘણીવાર API ના વપરાશની મર્યાદાઓ ઓળંગવાનું ટાળવા માટે રેટ લિમિટિંગ લાગુ કરવાની જરૂર પડે છે. રેટ લિમિટ ભૂલોને સંચાલિત કરવા માટે યોગ્ય એરર હેન્ડલિંગ આવશ્યક છે.
const rateLimit = 5; // Number of requests per second
let requestCount = 0;
let lastRequestTime = 0;
async function throttledFetch(url) {
const now = Date.now();
if (requestCount >= rateLimit && now - lastRequestTime < 1000) {
const delay = 1000 - (now - lastRequestTime);
console.log(`Rate limit exceeded. Waiting ${delay}ms...`);
await new Promise(resolve => setTimeout(resolve, delay));
}
try {
const response = await fetch(url);
if (response.status === 429) { // Rate limit exceeded
console.warn('Rate limit exceeded. Retrying after a delay...');
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait longer
return throttledFetch(url); // Retry
}
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
requestCount++;
lastRequestTime = Date.now();
return data;
} catch (error) {
console.error(`Error fetching ${url}:`, error);
throw error; // Re-throw the error after logging
}
}
async function* fetchUrls(urls) {
for (const url of urls) {
try {
yield await throttledFetch(url);
} catch (err) {
console.error(`Failed to fetch URL ${url} after retries. Skipping.`);
yield { error: `Failed to fetch ${url}` }; // Signal error to consumer
}
}
}
async function consumeData() {
const urls = ['https://api.example.com/resource1', 'https://api.example.com/resource2', 'https://api.example.com/resource3'];
for await (const item of fetchUrls(urls)) {
if (item.error) {
console.warn(`Error: ${item.error}`);
} else {
console.log('Data:', item);
}
}
}
consumeData();
આ ઉદાહરણમાં, throttledFetch ફંક્શન એક સેકન્ડમાં કરેલી વિનંતીઓની સંખ્યાને ટ્રેક કરીને રેટ લિમિટિંગ લાગુ કરે છે. જો રેટ લિમિટ ઓળંગી જાય, તો તે આગામી વિનંતી કરતા પહેલા ટૂંકા વિલંબ માટે રાહ જુએ છે. જો 429 (Too Many Requests) એરર મળે, તો તે લાંબો સમય રાહ જુએ છે અને વિનંતીને ફરીથી પ્રયાસ કરે છે. ભૂલોને પણ લોગ કરવામાં આવે છે અને કોલર દ્વારા હેન્ડલ કરવા માટે ફરીથી ફેંકવામાં આવે છે.
નિષ્કર્ષ
એરર હેન્ડલિંગ એ અસિંક્રોનસ પ્રોગ્રામિંગનો એક નિર્ણાયક પાસું છે, ખાસ કરીને જ્યારે async iterators અને async generator functions સાથે કામ કરતી વખતે. એરર પ્રોપેગેશન માટેની વ્યૂહરચનાઓ સમજીને અને શ્રેષ્ઠ પદ્ધતિઓ લાગુ કરીને, તમે મજબૂત અને વિશ્વસનીય સ્ટ્રીમિંગ એપ્લિકેશન્સ બનાવી શકો છો જે ભૂલોને યોગ્ય રીતે હેન્ડલ કરે છે અને અણધારી ક્રેશને અટકાવે છે. સ્થાનિક એરર હેન્ડલિંગને પ્રાથમિકતા આપવાનું યાદ રાખો, ફોલબેક મૂલ્યો પ્રદાન કરો, ભૂલોને અસરકારક રીતે લોગ કરો અને વધારાની સ્થિતિસ્થાપકતા માટે ગ્લોબલ એરર હેન્ડલિંગ મિકેનિઝમ્સનો વિચાર કરો. હંમેશા નિષ્ફળતા માટે ડિઝાઇન કરવાનું યાદ રાખો અને તમારી એપ્લિકેશન્સને ભૂલોમાંથી યોગ્ય રીતે પુનઃપ્રાપ્ત કરવા માટે બનાવો.